home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Shareware World / Comms & Internet / HTML and CSS modes / HTML and CSS Modes / htmlMode.tcl < prev    next >
Text File  |  1998-11-01  |  40KB  |  1,098 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode 2.1.3: tools for editing HTML documents
  4.  # 
  5.  #  FILE: "htmlMode.tcl"
  6.  #                                    created: 95-04-26 14.49.04 
  7.  #                                last update: 98-11-01 17.00.51 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jl@theophys.kth.se>
  10.  #     www: <http://bach.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.1.3
  13.  # 
  14.  # version 0.24 (16 July 95) by Scott W. Brim <swb1@cornell.edu>
  15.  # version 1.0 -- 2.1.3 (November 98) by Johan Linde <jl@theophys.kth.se>
  16.  #
  17.  # Copyright 1996-1998 by Johan Linde
  18.  #  
  19.  # This software may be used freely, and distributed freely, as long as the 
  20.  # receiver is not obligated in any way by receiving it.
  21.  #  
  22.  # If you make improvements to this file, please share them!
  23.  # 
  24.  # ###################################################################
  25.  ##
  26.  
  27. if {[alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  28. alpha::mode HTML 2.1.3 htmlMenu \
  29.   {*.html *.htm *.shtml *.HTML *.HTM *.SHTML } {
  30.     htmlMenu htmlUtilsMenu electricBraces electricSemicolon electricReturn electricTab
  31. } {
  32.     addMenu     htmlMenu
  33.     addMenu     htmlUtilsMenu
  34. } uninstall {
  35.     set __dir [file dirname [procs::find htmlMenu]]
  36.     foreach __file {Mode 40 Custom Elems Engine Entities HomePageUtils Menu StatusBar Utils} {
  37.         catch {removeFile $__dir:html${__file}.tcl}
  38.     }
  39.     catch {removeFile "$HOME:Tcl:Completions:HTMLCompletions.tcl"}
  40.     if {[procs::find cssMenu] == ""} {
  41.         catch {removeFile $__dir:hctsmsl.tcl}
  42.         catch {removeFile $__dir:hctsmslShared.tcl}
  43.         catch {removeFile $__dir:hctsmslMenu.tcl}
  44.         catch {removeFile "$HOME:Help:HTML Help"}
  45.         catch {removeFile "$HOME:Tcl:Completions:CSSCompletions.tcl"}
  46.     }
  47. } maintainer {
  48.     "Johan Linde" jl@theophys.kth.se <http://www.theophys.kth.se/~jl/Alpha.html>
  49. } help {file "HTML Help"}
  50. catch {unset HTMLmodeVars(elecRBrace)}
  51. catch {unset HTMLmodeVars(elecLBrace)}
  52. catch {unset HTMLmodeVars(electricSemi)}
  53. catch {unset HTMLmodeVars(electricTab)}
  54. } else {
  55. ;alpha::mode HTML 2.1.3 htmlMenu \
  56.   {*.html *.htm *.shtml *.HTML *.HTM *.SHTML } {htmlMenu htmlUtilsMenu} {
  57.     addMenu     htmlMenu
  58.     addMenu     htmlUtilsMenu
  59. } uninstall {
  60.     set __dir [file dirname [procs::find htmlMenu]]
  61.     foreach __file {Mode 40 Custom Elems Engine Entities HomePageUtils Menu StatusBar Utils} {
  62.         catch {removeFile $__dir:html${__file}.tcl}
  63.     }
  64.     catch {removeFile "$HOME:Tcl:Completions:HTMLCompletions.tcl"}
  65.     if {[procs::find cssMenu] == ""} {
  66.         catch {removeFile $__dir:hctsmsl.tcl}
  67.         catch {removeFile $__dir:hctsmslShared.tcl}
  68.         catch {removeFile $__dir:hctsmslMenu.tcl}
  69.         catch {removeFile "$HOME:Help:HTML Help"}
  70.         catch {removeFile "$HOME:Tcl:Completions:CSSCompletions.tcl"}
  71.     }
  72. } maintainer {
  73.     "Johan Linde" jl@theophys.kth.se <http://www.theophys.kth.se/~jl/Alpha.html>
  74. } help {file "HTML Help"}
  75. # Electric left brace?
  76. newPref f elecRBrace 1 HTML
  77. # Electric right brace?
  78. newPref f elecLBrace 1 HTML
  79. # Electric semi colon?
  80. newPref f electricSemi 1 HTML
  81. newPref f electricTab 1 HTML
  82. }
  83.  
  84. # called by Alpha to load HTML in.  
  85. proc htmlMenu {} {}
  86. proc htmlUtilsMenu {} {}
  87.  
  88. # A few definitions so that HTML mode runs with Alpha 7.0.
  89. if {![info exists elecStopMarker]} {
  90.     set elecStopMarker •
  91. }
  92. if {![alpha::package vsatisfies ${alpha::version} 7.0p5]} {
  93. ;proc is::Whitespace {anyString} {
  94.     return [regexp "^\[ \t\r\n\]*$" $anyString]
  95. }
  96. ;proc is::UnsignedInteger {str1} {
  97.     return [regexp {^[0-9]+$} [string trim $str1]]
  98. }
  99. ;proc is::PositiveInteger {str1} {
  100.     if [is::UnsignedInteger $str1] {
  101.         return [expr $str1 > 0]
  102.     }
  103.     return 0
  104. }
  105. }
  106. if {![alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  107. ;proc bind::fromArray {arr bindarr {unbind 0} {mode {}}} {
  108.     upvar $arr ar
  109.     upvar $bindarr br
  110.     set r {}
  111.     if $unbind {
  112.         set bindcmd "unbind"
  113.     } else {
  114.         set bindcmd "bind"
  115.     }
  116.     foreach a [array names ar] {
  117.         if {[set b $ar($a)] != ""} {
  118.             if [info exists br($a)] {
  119.                 catch {eval $bindcmd [keys::toBind $b] [list $br($a)] $mode}
  120.             } else {
  121.                 beep; message "Bad bind-array entry '$a'"
  122.             }
  123.         }
  124.     }
  125. }
  126. }
  127.  
  128.  
  129. #===============================================================================
  130. # Global variables and their management
  131. #===============================================================================
  132.  
  133. # Unsetting some old prefs
  134. foreach _tmp {htmlPackageToUse hideNetscape hideIE inclEventHandler hideStyleAttrs useAttsApplyToDialogs} {
  135.     catch {unset HTMLmodeVars($_tmp)}
  136. }
  137.  
  138. set htmlIconTxt {"Netscape Navigator 3" "Netscape Navigator 4" "Netscape Communicator" "Internet Explorer" Cyberdog MacLynx Mosaic}
  139. set htmlIcons {•135 •293 •294 •295 •281 •296 •942}
  140.  
  141. # Menu icons
  142. newPref v htmlMenuIcon •294 HTML
  143. newPref v htmlUtilsMenuIcon •281 HTML
  144.  
  145. if {$HTMLmodeVars(htmlMenuIcon) == $HTMLmodeVars(htmlUtilsMenuIcon)} {
  146.     foreach _tmp $htmlIcons {
  147.         if {$HTMLmodeVars(htmlMenuIcon) != $_tmp} {
  148.             set HTMLmodeVars(htmlUtilsMenuIcon) $_tmp
  149.             lappend modifiedModeVars {htmlUtilsMenuIcon HTMLmodeVars}
  150.             break
  151.         }
  152.     }
  153. }
  154.  
  155. set htmlMenu $HTMLmodeVars(htmlMenuIcon)
  156. set htmlUtilsMenu $HTMLmodeVars(htmlUtilsMenuIcon)
  157.  
  158. # Line width
  159. newPref v fillColumn 75 HTML
  160. newPref v leftFillColumn 0 HTML
  161. # word breaking and word wrapping
  162. newPref v wordBreak {\w+} HTML
  163. newPref v wordBreakPreface {(\W)} HTML
  164. newPref v wrapBreak {[\w_]+} HTML
  165. newPref v wrapBreakPreface {([^\w_])} HTML
  166. newPref f wordWrap    1 HTML
  167.  
  168. # Indentation
  169. newPref f indentAPPLET 0 HTML
  170. newPref f indentBLOCKQUOTE 0 HTML
  171. newPref f indentBODY 0 HTML
  172. newPref f indentCENTER 0 HTML
  173. newPref f indentDIR 1 HTML
  174. newPref f indentDIV 0 HTML
  175. newPref f indentDL 1 HTML
  176. newPref f indentFIELDSET 0 HTML
  177. newPref f indentFORM 0 HTML
  178. newPref f indentFRAMESET 0 HTML
  179. newPref f indentHEAD 0 HTML
  180. newPref f indentMAP 0 HTML
  181. newPref f indentMENU 1 HTML
  182. newPref f indentMULTICOL 0 HTML
  183. newPref f indentNOEMBED 0 HTML
  184. newPref f indentNOFRAMES 0 HTML
  185. newPref f indentNOSCRIPT 0 HTML
  186. newPref f indentOBJECT 0 HTML
  187. newPref f indentOL 1 HTML
  188. newPref f indentOPTGROUP 0 HTML
  189. newPref f indentP 0 HTML
  190. newPref f indentSELECT 0 HTML
  191. newPref f indentTABLE 1 HTML
  192. newPref f indentTR 1 HTML
  193. newPref f indentUL 1 HTML
  194. set htmlIndentElements {HEAD BODY P DIV BLOCKQUOTE CENTER MULTICOL OBJECT NOEMBED OL UL DIR MENU DL
  195. FORM FIELDSET SELECT OPTGROUP TABLE TR FRAMESET NOFRAMES MAP APPLET NOSCRIPT}
  196.  
  197. # browsers
  198. if {![info exists browserSig] && [catch {getFileSig [icGetPref -t 1 Helper•http]} browserSig]} {set browserSig MOSS}
  199. # Browser signatures
  200. newPref v browsers {MOSS MSIE} HTML
  201.  
  202. newPref v prefixString    "<!-- " HTML
  203. newPref v suffixString    " -->" HTML
  204.  
  205. # Paths to footer files.
  206. newPref v footers {} HTML
  207. # Tag color
  208. newPref v tagColor        blue HTML
  209. # Attribute color
  210. newPref v attributeColor magenta HTML
  211. # Simple coloring?
  212. newPref f simpleColoring 0 HTML
  213. # Should elements be lower case?
  214. newPref f useLowerCase    0 HTML
  215. # Should •'s be inserted?
  216. newPref    f useTabMarks    1 HTML
  217. # Is <p> a container?
  218. newPref f pIsContainer    1 HTML
  219. # Are LI DT and DD containers 
  220. newPref f lidtAreContainers 0  HTML
  221. # A window cache with frames.
  222. newPref v windows        {} HTML
  223. # When browser is launched, should it be brought to front?
  224. newPref    f browseInForeground    1 HTML
  225. # Save without asking when sending file to browser?
  226. newPref f saveWithoutAsking 0 HTML
  227. # Default list of commonly used character entities
  228. newPref v defaultCommonChars {"less than" "greater than" "ampersand" "nonbreak space"} HTML
  229. # List of commonly used character entities
  230. newPref v commonChars $HTMLmodeVars(defaultCommonChars) HTML
  231. # Never ask about extensions?
  232. newPref f hideExtensions 0 HTML
  233. # Never ask about deprecated elements and attributes?
  234. newPref f hideDeprecated 0 HTML
  235. # Attributes globally not asked about at first
  236. newPref v dontaskforAttributes {} HTML
  237. # Attributes globally never asked about
  238. newPref v neveraskforAttributes {} HTML
  239. # Attributes globally always asked about
  240. newPref v alwaysaskforAttributes {} HTML
  241. # Beep when asking for attributes in the status bar?
  242. newPref f promptNoisily 1 HTML
  243. # Flash status bar for first attribute?
  244. newPref f flashStatusBar 1 HTML
  245. # Input from dialog windows or status bar?
  246. newPref f useBigWindows 1 HTML
  247. # Change attributes in dialog windows or status bar?
  248. newPref f changeInBigWindows 1 HTML
  249. # Cmd-double-click on non text file link opens file?
  250. newPref f openNonTextFile 1 HTML
  251. # Return on non text file in home page window opens file?
  252. newPref f homeOpenNonTextFile 1 HTML
  253. # Check anchors in links?
  254. newPref f checkAnchors 1 HTML
  255. # Case sensistive link checking?
  256. newPref f caseSensitive 0 HTML
  257. # Check links with Big Brother?
  258. newPref f useBigBrother 0 HTML
  259. newPref f checkInFront 1 HTML
  260. newPref f useBBoptions 1 HTML
  261. newPref f ignoreRemote 0 HTML
  262. newPref f ignoreLocal 0 HTML
  263. # Folder for HTML manual.
  264. newPref v manualFolder "$HOME:HTML mode manual" HTML
  265. newPref v manualStartPage 0 HTML
  266. # FTP servers
  267. newPref v FTPservers {} HTML
  268. # Last modified string
  269. newPref v lastModified "Last modified" HTML
  270. # 'Insert include tags' only inserts tags, and not the file?
  271. newPref f includeOnlyTags 1 HTML
  272. # Color JavaScript keywords?
  273. newPref f JavaScriptColoring 0 HTML
  274. # Color of JavaScript keywords
  275. newPref v JavaScriptColor    magenta HTML
  276. # Color of strings
  277. newPref v stringColor green HTML
  278. # Color of JavaScript comments
  279. newPref v JavaCommentColor red HTML
  280. # Color CSS keywords?
  281. newPref f CSSColoring 0 HTML
  282. # Color of CSS keywords
  283. newPref v CSSColor cyan HTML
  284.  
  285.  
  286. # These attributes are URLs.
  287. set htmlURLAttr    {HREF= SRC= LOWSRC= ACTION= USEMAP= BACKGROUND= CODEBASE= PLUGINSPAGE=
  288. DYNSRC= CLASSID= DATA= CITE= LONGDESC= PROFILE=}
  289. # These element attributes are colors
  290. set htmlColorAttr    {BGCOLOR= TEXT= LINK= VLINK= ALINK= COLOR= BORDERCOLOR=
  291. BORDERCOLORDARK= BORDERCOLORLIGHT=}
  292. # These attributes are windows
  293. set htmlWindowAttr {TARGET=}
  294. # Special cases with URLs, colors and windows
  295. set htmlSpecURL {}
  296. set htmlSpecColor {}
  297. set htmlSpecWindow {}
  298. # These elements can be in document HEAD.
  299. set htmlHeadElements1 {BASE ISINDEX LINK META STYLE SCRIPT OBJECT}
  300. # These elements are plug-ins.
  301. set htmlPlugins {EMBED LIVEAUDIO LIVEVIDEO "QUICKTIME MOVIE" "QUICKTIME VR" REALAUDIO}
  302. # HTML mode version
  303. set htmlVersion 2.1
  304.  
  305. # Register eventhandler for Big Brother events
  306. eventHandler Bbth Chkd htmlBbthChkdHandler 
  307.  
  308. # Used by fillParagraph
  309. set htmlParaCommands {html|head|title|body|h[1-6]|p|div|blockquote|center|address|pre|multicol}
  310. append htmlParaCommands {|br|hr|wbr|basefont|ul|ol|li|dir|menu|dl|dd|dt|form|input}
  311. append htmlParaCommands {|select|option|textarea|caption|table|tr|frameset|frame|noframes}
  312. append htmlParaCommands {|map|area|applet|param|script|noscript|layer|ilayer|nolayer|base|link|meta|isindex}
  313. append htmlParaCommands {|col|colgroup|marquee|object|thead|tbody|tfoot}
  314. append htmlParaCommands {|bdo|ins|del|fieldset|legend|button|optgroup}
  315.  
  316. #
  317. # Internal Globals
  318. #
  319. set htmlCurSel    ""
  320. set htmlIsSel    0
  321. set htmlAdditionExist 0
  322. set htmlHomePageWinList {}
  323. set homeTime 0
  324. set htmlNumBbthChecking 0
  325. set htmlHideDeprecated 0
  326. set htmlHideExtensions 0
  327. set htmlHideFrames 0
  328.  
  329. # Load other HTML mode files.
  330. foreach tmp {htmlEngine htmlElems htmlEntities htmlUtils hctsmslShared hctsmslMenu htmlMenu} {
  331.     if {[info exists cssModeIsLoaded] && ($tmp == "hctsmslMenu" || $tmp == "hctsmslShared")} {continue}
  332.     if { [catch {eval ${tmp}.tcl}] } {
  333.         beep
  334.         alertnote "Loading of ${tmp}.tcl failed"
  335.         return
  336.     }
  337. }
  338.  
  339. if {(!$HTMLmodeVars(useBigWindows) || !$HTMLmodeVars(changeInBigWindows)) && [catch {htmlStatusBar.tcl}] } {
  340.     beep
  341.     alertnote "Loading of htmlStatusBar.tcl failed"
  342.     return
  343. }
  344.  
  345. # Silently add missing menu.
  346. if {[info exists modeMenus(HTML)]} {
  347.     if {[lsearch -exact $modeMenus(HTML) htmlMenu] < 0} {
  348.         lappend modeMenus(HTML) htmlMenu
  349.     }
  350.     if {[lsearch -exact $modeMenus(HTML) htmlUtilsMenu] < 0} {
  351.         lappend modeMenus(HTML) htmlUtilsMenu
  352.     }
  353. }
  354. if {[info exists mode::features(HTML)]} {
  355.     if {[lsearch -exact [set mode::features(HTML)] htmlMenu] < 0} {
  356.         lappend mode::features(HTML) htmlMenu
  357.     }
  358.     if {[lsearch -exact [set mode::features(HTML)] htmlUtilsMenu] < 0} {
  359.         lappend mode::features(HTML) htmlUtilsMenu
  360.     }
  361. }
  362.  
  363. # Clean up tmp files
  364. if {[file exists $PREFS:HTMLtmp]} {
  365.     if {[file exists $PREFS:HTMLtmp:incl]} {catch {rm -r $PREFS:HTMLtmp:incl}}
  366.     if {[file exists $PREFS:HTMLtmp:xincl]} {catch {rm -r $PREFS:HTMLtmp:xincl}}
  367.     catch {rm $PREFS:HTMLtmp:*}
  368. }
  369.  
  370.  
  371. #
  372. # Read custom elements
  373. #
  374.  
  375. proc htmlReadAdditions {} {
  376.     global PREFS htmlElemAttrRequired1 htmlElemAttrOptional1 htmlElemAttrChoices1
  377.     global htmlElemAttrNumber1 htmlElemEventHandler1 htmlElemKeyBinding htmlElemProc
  378.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlPlugins
  379.     global htmlSpecURL htmlSpecColor htmlSpecWindow htmlVersion htmlShownWarning
  380.  
  381.     html40.tcl
  382.     message "Loading custom elements…"
  383.     
  384.     
  385.     if {[catch {open $PREFS:HTMLadditions.tcl r} fid]} {
  386.         alertnote "Could not open the file HTMLAdditions.tcl with your custom elements."
  387.         return
  388.     }
  389.     set additions [read -nonewline $fid]
  390.     close $fid
  391.     set lines [split $additions "\n"]
  392.     set version [lindex $lines 0]
  393.     if {$version == $htmlVersion} {htmlReadAdditions0 $lines; return}
  394.     if {$version > $htmlVersion} {
  395.         regsub "\[^\n\]+" $additions $htmlVersion additions
  396.         set fid [open $PREFS:HTMLadditions.tcl w]
  397.         puts $fid $additions
  398.         close $fid
  399.         htmlReadAdditions0 $lines
  400.         return
  401.     }
  402.     set allattrs [htmlGetAllAttrs]
  403.     set newLines "$htmlVersion\n"
  404.     set changed 0
  405.     set tmpSpecURL ""
  406.     set tmpSpecColor ""
  407.     set tmpSpecWindow ""
  408.     foreach line [lrange $lines 1 end] {
  409.         set elem [lindex $line 0]
  410.         set command [lindex $line 1]
  411.         set elemExists [info exists htmlElemAttrOptional1($elem)]
  412.         if {$elemExists} {
  413.             foreach x [list AttrOptional1 AttrRequired1 AttrNumber1 AttrChoices1 EventHandler1] {
  414.                 if {[info exists htmlElem${x}($elem)]} {
  415.                     set $x [string toupper [set htmlElem${x}($elem)]]
  416.                 } else {
  417.                     set $x ""
  418.                 }
  419.             }
  420.             set attrs [concat $AttrOptional1 $AttrRequired1 $EventHandler1]
  421.             foreach at $attrs {
  422.                 if {[string trimright $at =] == $at} {
  423.                     lappend attrs "${at}="
  424.                 } else {
  425.                     lappend attrs [string trimright $at =]
  426.                 }
  427.             }
  428.         } else {
  429.             set attrs {}
  430.         }
  431.         set var [lindex $command 1]
  432.         foreach ucw [list URL Color Window] {
  433.             if {$var == "html${ucw}Attr"} {
  434.                 set att [lindex $command 2]
  435.                 if {[lsearch -exact [set html${ucw}Attr] $att] >=0} {
  436.                     # Already defined.
  437.                     set changed 1
  438.                 } elseif {[lsearch -exact $allattrs $att] >=0 || [lsearch -exact $allattrs [string trimright $att =]] >=0} {
  439.                     # Used for some other kind of attr.
  440.                     lappend ${ucw}SpecMaybe $att
  441.                     set changed 1
  442.                 } elseif {[lsearch -exact $attrs $att] >= 0} {
  443.                     # Attr already exists for elem.
  444.                     lappend ${ucw}Maybe $att
  445.                     set changed 1
  446.                 } else {
  447.                     append newLines "$line\n"
  448.                 }
  449.             }
  450.             if {$var == "htmlSpec${ucw}"} {
  451.                 set tmpadd [lrange $command 2 end]
  452.                 foreach x $tmpadd {
  453.                     regexp {[^!=]!?=(.*)} $x dum tmp
  454.                     # Only add if attr doesn't exist.
  455.                     if {[lsearch -exact $attrs $tmp] >= 0} {
  456.                         set changed 1
  457.                         set where [lsearch -exact $tmpadd $x]
  458.                         set tmpadd [lreplace $tmpadd $where $where]
  459.                     }
  460.                 }
  461.                 if {[llength $tmpadd]} {
  462.                     append newLines "[list $elem] \{lappend htmlSpec${ucw} $tmpadd\}\n"
  463.                     append tmpSpec${ucw} " " $tmpadd
  464.                 }
  465.             }
  466.         }
  467.         if {[lsearch {htmlURLAttr htmlColorAttr htmlWindowAttr htmlSpecURL \
  468.         htmlSpecColor htmlSpecWindow} $var] < 0} {
  469.             # If element doesn't exist, GO!
  470.             if {!$elemExists} {
  471.                 append newLines "$line\n"
  472.                 regsub "html" $command "tmp" command
  473.                 eval $command
  474.                 continue
  475.             }
  476.             # Skip these vars if element exists.
  477.             if {[string match "htmlElemKeyBinding*" $var] || [string match "htmlElemProc*" $var] ||
  478.             $var == "htmlPlugins"} {
  479.                 set changed 1
  480.                 continue
  481.             }
  482.             regexp {([^\(]+)\(([^\)]+)\)[ ]+(.+)} [lrange $command 1 end] dummy var arg added
  483.             set added [string trimleft [string trimright $added \}] \{]
  484.             foreach c $added {
  485.                 if {$var == "htmlElemAttrChoices1"} {
  486.                     regexp {[^=]*=} $c tmp
  487.                     # Don't add choices if they exist or if attr isn't a choice attr.
  488.                     if {[lsearch -exact $AttrChoices1 $c] >= 0 || ([lsearch -exact $attrs $tmp] >= 0 &&
  489.                     [lsearch $AttrChoices1 "${tmp}*"] < 0) } {
  490.                         set changed 1
  491.                         set where [lsearch -exact $added $c]
  492.                         set added [lreplace $added $where $where]
  493.                     }
  494.                 } else {
  495.                     if {$var == "htmlElemAttrNumber1"} {
  496.                         regexp {[^=]*=} $c tmp
  497.                     } else {
  498.                         set tmp [string toupper $c]
  499.                     }
  500.                     # Don't add attrs which exist.
  501.                     if {[lsearch -exact $attrs $tmp] >= 0} {
  502.                         set changed 1
  503.                         set where [lsearch -exact $added $c]
  504.                         set added [lreplace $added $where $where]
  505.                     }
  506.                 }
  507.             }
  508.             if {[llength $added]} {
  509.                 append newLines "[list $elem] \{lappend ${var}($arg) $added\}\n"
  510.                 regsub "html" $var "tmp" var
  511.                 eval "lappend ${var}($arg) $added"
  512.             }
  513.         }
  514.     }
  515.     foreach ucw [list URL Color Window] {
  516.         if {[info exists ${ucw}SpecMaybe]} {
  517.             foreach m [set ${ucw}SpecMaybe] {
  518.                 foreach e [array names tmpElemAttrRequired1] {
  519.                     if {[lsearch -exact $tmpElemAttrRequired1($e) $m] >= 0 && \
  520.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  521.                         append newLines "[list $e] \{lappend htmlSpec${ucw} ${e}=[string trimright $m =]\}\n"
  522.                     } 
  523.                 }
  524.                 foreach e [array names tmpElemAttrOptional1] {
  525.                     if {[lsearch -exact $tmpElemAttrOptional1($e) $m] >= 0 && \
  526.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  527.                         append newLines "[list $e] \{lappend htmlSpec${ucw} ${e}=[string trimright $m =]\}\n"
  528.                     } 
  529.                 }
  530.             }
  531.         }
  532.         if {[info exists ${ucw}Maybe]} {
  533.             foreach m [set ${ucw}Maybe] {
  534.                 set foundit 0
  535.                 foreach e [array names tmpElemAttrRequired1] {
  536.                     if {[lsearch -exact $tmpElemAttrRequired1($e) $m] >= 0 && \
  537.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  538.                         append newLines "[list $e] \{lappend html${ucw}Attr $m\}\n"
  539.                         set foundit 1
  540.                         break
  541.                     } 
  542.                 }
  543.                 if {$foundit} {continue}
  544.                 foreach e [array names tmpElemAttrOptional1] {
  545.                     if {[lsearch -exact $tmpElemAttrOptional1($e) $m] >= 0 && \
  546.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  547.                         append newLines "[list $e] \{lappend html${ucw}Attr $m\}\n"
  548.                         break
  549.                     } 
  550.                 }
  551.             }
  552.         }    
  553.     }
  554.     
  555.     if {$newLines != "$htmlVersion\n"} {htmlReadAdditions0 [split [string trimright $newLines "\n"] "\n"]}
  556.     if {$changed} {
  557.         beep
  558.         if {[lindex [dialog -w 300 -h 270 -b "Clean up" 20 240 100 260 \
  559.         -b "Leave it" 120 240 200 260 -t "Some of your custom elements are supported by this\
  560.         version of HTML mode." 10 10 290 45 -t "Choose 'Clean up' to update your file with custom\
  561.         elements and to avoid this alert next time you run Alpha.\
  562.         If you do so, some elements will not be defined correctly if you go back to\
  563.         a previous version of HTML mode." 10 50 290 150 -t "Choose 'Leave it' to leave your file\
  564.         with custom elements untouched. If you do so, the submenu 'Extend', where you can add new custom\
  565.         elements, will be disabled." 10 160 290 225] 1]} {
  566.             set htmlShownWarning 1
  567.             return
  568.         }
  569.     }
  570.     if {$newLines == "$htmlVersion\n"} {
  571.         removeFile $PREFS:HTMLadditions.tcl
  572.     } else {
  573.         set fid [open $PREFS:HTMLadditions.tcl w]
  574.         puts -nonewline $fid $newLines
  575.         close $fid
  576.     }
  577. }
  578.  
  579. proc htmlReadAdditions0 {lines} {
  580.     global htmlElemAttrRequired1 htmlElemAttrOptional1 htmlElemAttrChoices1
  581.     global htmlElemAttrNumber1 htmlElemEventHandler1 htmlElemKeyBinding htmlElemProc
  582.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlPlugins
  583.     global htmlSpecURL htmlSpecColor htmlSpecWindow htmlAdditionExist htmlShownWarning
  584.     
  585.     foreach line [lrange $lines 1 end] {
  586.         if {[catch {eval [lindex $line 1]}]} {
  587.             alertnote "There is an error in the file HTMLAdditions.tcl with your custom elements."
  588.             set htmlShownWarning 1
  589.             break
  590.         }
  591.     }
  592.     set htmlAdditionExist 1
  593. }
  594.  
  595. #
  596. # Color support
  597. #
  598.  
  599. proc htmlColorizing {{changing 0}} {
  600.      global HTMLmodeVars HTMLwords htmlElemAttrOptional1 htmlElemAttrRequired1
  601.      global htmlElemEventHandler1 PREFS htmlElemKeyBinding
  602.      
  603.      set HTMLKeyWords {}
  604.     if {[info exists HTMLwords]} {set HTMLKeyWords $HTMLwords}
  605.  
  606.     if {!$HTMLmodeVars(simpleColoring)} {
  607.         # All HTML elements
  608.         set allHTMLwords [concat {A ABBR ACRONYM ADDRESS APPLET AREA B BASE 
  609.         BASEFONT BDO BGSOUND BIG BLINK BLOCKQUOTE BODY BR BUTTON CAPTION 
  610.         CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM EMBED 
  611.         FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I 
  612.         IFRAME ILAYER IMG INPUT INS ISINDEX KBD KEYGEN LABEL LAYER LEGEND 
  613.         LI LINK MAP MARQUEE MENU META MULTICOL NOBR NOEMBED NOFRAMES 
  614.         NOLAYER NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP 
  615.         SCRIPT SELECT SERVER SMALL SPACER SPAN STRIKE STRONG STYLE SUB SUP TABLE 
  616.         TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR WBR} [array names htmlElemKeyBinding]]
  617.     
  618.         foreach elem $allHTMLwords {
  619.             lappend allHTMLkeywords "<${elem}" "/${elem}"
  620.         }
  621.         # All attributes
  622.         set attributeWords {ABBR= ABOVE= ACCEPT-CHARSET= ACCEPT= ACCESSKEY= 
  623.         ACTION= ALIGN= ALINK= ALT= ARCHIVE= AUTOPLAY= AUTOSTART= AXIS= 
  624.         BACKGROUND= BEHAVIOR= BELOW= BGCOLOR= BGPROPERTIES= BORDER= 
  625.         BORDERCOLOR= BORDERCOLORDARK= BORDERCOLORLIGHT= CELLPADDING= 
  626.         CELLSPACING= CHALLENGE= CHAR= CHAROFF= CHARSET= CHECKED CITE= 
  627.         CLASS= CLASSID= CLEAR= CLIP= CODE= CODEBASE= CODETYPE= COLOR= COLS= 
  628.         COLSPAN= COMPACT CONSOLE= CONTENT= CONTROLLER= CONTROLS CONTROLS= 
  629.         COORDS= CORRECTION= DATA= DATETIME= DECLARE DEFER DIR= DIRECTION= 
  630.         DISABLED DYNSRC= ENCTYPE= FACE= FOR= FOV= FRAME= FRAMEBORDER= 
  631.         FRAMESPACING= GUTTER= HEADERS= HEIGHT= HIDDEN= HREF= HREFLANG= 
  632.         HSPACE= HTTP-EQUIV= ID= ISMAP LABEL= LANG= LANGUAGE= LEFT= 
  633.         LEFTMARGIN= LINK= LONGDESC= LOOP= LOWSRC= MARGINHEIGHT= 
  634.         MARGINWIDTH= MAXLENGTH= MAYSCRIPT MEDIA= METHOD= MULTIPLE NAME= 
  635.         NODE= NOHREF NOLABELS= NORESIZE NOSHADE NOWRAP OBJECT= PAGEX= 
  636.         PAGEY= PAN= PLAYEVERYFRAME= PLUGINSPAGE= POINT-SIZE= PROFILE= 
  637.         PROMPT= READONLY REL= REV= ROWS= ROWSPAN= RULES= SCHEME= SCOPE= 
  638.         SCROLLAMOUNT= SCROLLDELAY= SCROLLING= SELECTED SHAPE= SIZE= SPAN= 
  639.         SRC= STANDBY= START= STYLE= SUMMARY= TABINDEX= TARGET= TEXT= TILT= 
  640.         TITLE= TOP= TOPMARGIN= TYPE= USEMAP= VALIGN= VALUE= VALUETYPE= 
  641.         VISIBILITY= VLINK= VSPACE= WIDTH= WRAP= Z-INDEX=}
  642.         # Custom element attributes
  643.         if {[file exists $PREFS:HTMLadditions.tcl] && ![catch {open $PREFS:HTMLadditions.tcl} fid]} {
  644.             set lines [lrange [split [read -nonewline $fid] "\n"] 1 end]
  645.             close $fid
  646.             foreach line $lines {
  647.                 set cmd [lindex $line 1]
  648.                 set added ""
  649.                 regexp {([^\(]+)\(([^\)]+)\)[ ]+(.+)} [lrange $cmd 1 end] dummy var arg added
  650.                 set added [string trimleft [string trimright $added \}] \{]
  651.                 if {$var == "htmlElemAttrRequired1" || $var == "htmlElemAttrOptional1"} {
  652.                     foreach attr $added {
  653.                         if {[lsearch -exact $attributeWords $attr] < 0} {
  654.                             lappend attributeWords $attr
  655.                         }
  656.                     }
  657.                 }
  658.             }
  659.         }
  660.         lappend attributeWords "FILE=" "FORM="
  661.         # JavaScript keywords.
  662.         set JavaScriptWords {break case continue default delete do export for import in 
  663.         function if else new return switch this typeof var void while with true false 
  664.         onAbort= onBlur= onChange= onClick= onDblClick= onError= onFocus= 
  665.         onKeyDown= onKeyPress= onKeyUp= onLoad= onMouseDown= onMouseMove= 
  666.         onMouseOut= onMouseOver= onMouseUp= onReset= onSelect= onSubmit= onUnload=}
  667.         # CSS keywords
  668.         set CSSwords {font-family font-style font-variant font-weight font-size font 
  669.         color background-color background-image background-repeat background-attachment
  670.         background-position background word-spacing letter-spacing text-decoration
  671.         vertical-align text-transform text-align text-indent line-height
  672.         margin-top margin-right margin-bottom margin-left margin padding-top padding-right
  673.         padding-bottom padding-left padding border-top-width border-right-width
  674.         border-bottom-width border-left-width border-width border-color border-style
  675.         border-top border-right border-bottom border-left border width height float clear
  676.         display white-space list-style-type list-style-image list-style-position list-style
  677.         @import important}
  678.         
  679.         if {!$changing} {
  680.             regModeKeywords -i "<" -i ">" -I $HTMLmodeVars(tagColor) \
  681.                 -s $HTMLmodeVars(stringColor)  -b "/*" "*/" -e "//" HTML {}
  682.         }
  683.         if {$HTMLmodeVars(JavaScriptColoring) || $HTMLmodeVars(CSSColoring)} {
  684.             set col $HTMLmodeVars(JavaCommentColor)
  685.         } else {
  686.             set col none
  687.         }
  688.         regModeKeywords -a -c $col HTML
  689.         if {$HTMLmodeVars(JavaScriptColoring)} {
  690.             set col $HTMLmodeVars(JavaScriptColor)
  691.         } else {
  692.             set col none
  693.         }
  694.         regModeKeywords -a -k $col HTML $JavaScriptWords
  695.         if {$HTMLmodeVars(CSSColoring)} {
  696.             set col $HTMLmodeVars(CSSColor)
  697.         } else {
  698.             set col none
  699.         }
  700.         regModeKeywords -a -k $col HTML $CSSwords
  701.         regModeKeywords -a -k $HTMLmodeVars(tagColor) \
  702.         HTML [concat $HTMLKeyWords $allHTMLkeywords]
  703.         regModeKeywords -a -k $HTMLmodeVars(attributeColor) HTML $attributeWords
  704.         regModeKeywords -a -k $HTMLmodeVars(JavaCommentColor) HTML {"<!--" "-->" "#INCLUDE" "/#INCLUDE"
  705.         "#LASTMODIFIED" "/#LASTMODIFIED" "#DOCINDEX" "/#DOCINDEX"}
  706.     } else {
  707.         regModeKeywords -b "<" ">" -c $HTMLmodeVars(tagColor) \
  708.         -k $HTMLmodeVars(tagColor) HTML $HTMLKeyWords
  709.     }
  710. }
  711.  
  712. # Change color when a color variable is changed.
  713. proc htmlChangeColorizing {flag} {
  714.     global HTMLmodeVars
  715.     set msg 0
  716.     switch -glob $flag {
  717.         simpleColoring {
  718.             htmlColorizing
  719.             set msg 1
  720.         }
  721.         JavaScriptColoring -
  722.         attributeColor -
  723.         CSSColoring {
  724.             if {!$HTMLmodeVars(simpleColoring)} {
  725.                 htmlColorizing 1
  726.             }
  727.         }
  728.         tagColor {
  729.             if {$HTMLmodeVars(simpleColoring)} {
  730.                 regModeKeywords -a -c $HTMLmodeVars(tagColor) HTML
  731.             } else {
  732.                 regModeKeywords -a -i "<" -i ">" -I $HTMLmodeVars(tagColor) HTML
  733.                 htmlColorizing 1
  734.             }
  735.         }
  736.         JavaScriptColor {
  737.             if {$HTMLmodeVars(JavaScriptColoring) && !$HTMLmodeVars(simpleColoring)} {
  738.                 htmlColorizing 1
  739.             }
  740.         }
  741.         JavaCommentColor {
  742.             if {($HTMLmodeVars(JavaScriptColoring) || $HTMLmodeVars(CSSColoring)) && !$HTMLmodeVars(simpleColoring)} {
  743.                 regModeKeywords -a -c $HTMLmodeVars(JavaCommentColor) HTML
  744.             }
  745.         }
  746.         CSSColor {
  747.             if {$HTMLmodeVars(CSSColoring) && !$HTMLmodeVars(simpleColoring)} {
  748.                 htmlColorizing 1
  749.             }
  750.         }    
  751.         stringColor {
  752.             if {!$HTMLmodeVars(simpleColoring)} {
  753.                 regModeKeywords -a -s $HTMLmodeVars(stringColor) HTML
  754.             }
  755.         }
  756.     }
  757.     refresh
  758.     if {$msg} {message "Coloring may not change until you switch to another window."}
  759. }
  760.  
  761. trace variable browserSig w htmlToggleBrowser2
  762.  
  763. # Dialog to set HTML mode variables.
  764. proc HTMLmodifyFlags {{which General}} {
  765.     global HTMLmodeVars modifiedModeVars htmlIconTxt htmlIcons htmlMenu htmlUtilsMenu
  766.     
  767.     if {$which == "Attributes"} {htmlGlobalAttrsPrefs; return}
  768.     
  769.     set box [eval html${which}PrefsBox]
  770.     set allFlags [eval html${which}Flags]
  771.  
  772.     set attrTxt {"status bar" "dialog boxes"}
  773.     set manTxt {"first page in manual" "table of contents without frames" "table of contents with frames"}
  774.     set values [eval [concat dialog -w 460 -h 315 -b OK 20 285 85 305 -b Cancel 110 285 175 305 $box]]
  775.     if {[lindex $values 1]} {return}
  776.     if {$which == "General" && [lindex $values 22] == [lindex $values 23]} {
  777.         alertnote "You can't use the same menu icon for both menus. Menu icon changes are ignored."
  778.         set allFlags [lrange $allFlags 0 18]
  779.     }
  780.     set i 1
  781.     if {$which == "General"} {incr i}
  782.     foreach flag $allFlags {
  783.         global $flag
  784.         incr i
  785.         set val [lindex $values $i]
  786.         if {$flag == "useBigWindows" || $flag == "changeInBigWindows"} {set val [lsearch -exact $attrTxt $val]}
  787.         if {$flag == "manualStartPage"} {set val [lsearch -exact $manTxt $val]}
  788.         if {[string match "*Icon" $flag]} {set val [lindex $htmlIcons [lsearch $htmlIconTxt $val]]}
  789.         if {$HTMLmodeVars($flag) != $val} {
  790.             set $flag $val
  791.             set HTMLmodeVars($flag) $val
  792.             lappend modifiedModeVars [list $flag HTMLmodeVars]
  793.             if {[string match "*Color*" $flag]} {htmlChangeColorizing $flag}
  794.             if {[string match "*Icon" $flag]} {
  795.                 removeMenu [set [string trim $flag "Icon"]]
  796.                 set [string trim $flag "Icon"] $val
  797.                 eval htmlBuild[string trim $flag Iconhtml]
  798.             }
  799.         }
  800.     }
  801. }
  802.  
  803. proc htmlGeneralPrefsBox {} {
  804.     global HTMLmodeVars htmlIconTxt htmlIcons alpha::colors elecStopMarker
  805.     
  806.     set attrTxt {"status bar" "dialog boxes"}
  807.     set manTxt {"first page in manual" "table of contents without frames" "table of contents with frames"}
  808.  
  809.     set box "-t {General HTML mode Preferences} 100 10 450 30 \
  810.     -m {{Page 1 of preferences} {Page 1 of preferences} {Page 2 of preferences} {Page 3 of preferences}} 100 35 300 55 \
  811.     -n {Page 1 of preferences} \
  812.     -c {Bring browser to front when sending a window to it} $HTMLmodeVars(browseInForeground) 10 65 450 80\
  813.     -c {Save window without asking when sending it to the browser} $HTMLmodeVars(saveWithoutAsking) 10 85 450 100 \
  814.     -c {Set tags in lower case} $HTMLmodeVars(useLowerCase) 10 105 200 120 \
  815.     -c {Use template stops ($elecStopMarker)} $HTMLmodeVars(useTabMarks) 10 125 450 140 \
  816.     -c {<P> has a closing tag </P>} $HTMLmodeVars(pIsContainer) 10 145 450 160 \
  817.     -c {<LI>, <DT> and <DD> have closing tags} $HTMLmodeVars(lidtAreContainers) 10 165 450 180 \
  818.     -t {Give attributes in}  10 185 150 200\
  819.     -m {[list [lindex $attrTxt $HTMLmodeVars(useBigWindows)]] {dialog boxes} {status bar}} 155 185 450 205 \
  820.     -t {Change attributes in} 10 210 150 225 \
  821.     -m {[list [lindex $attrTxt $HTMLmodeVars(changeInBigWindows)]] {dialog boxes} {status bar}} 155 210 450 230 \
  822.     -c {Beep for first attribute (applies only if you use the status bar)} $HTMLmodeVars(promptNoisily) 10 235 450 250 \
  823.     -c {Flash status bar for first attribute} $HTMLmodeVars(flashStatusBar) 10 255 450 270 \
  824.     -n {Page 2 of preferences} \
  825.     -c {Simple coloring} $HTMLmodeVars(simpleColoring) 10 65 450 80 \
  826.     -t {Color of HTML tags:} 10 85 150 100 \
  827.     -m [list [concat $HTMLmodeVars(tagColor) ${alpha::colors}]] 160 85 310 105 \
  828.     -t {Color of attributes:} 10 110 150 125 \
  829.     -m [list [concat $HTMLmodeVars(attributeColor) ${alpha::colors}]] 160 110 310 130 \
  830.     -t {Color of strings:} 10 135 150 150 \
  831.     -m [list [concat $HTMLmodeVars(stringColor) ${alpha::colors}]] 160 135 310 155 \
  832.     -t {'Help' opens} 10 160 95 175 \
  833.     -m {[concat [list [lindex $manTxt $HTMLmodeVars(manualStartPage)]] $manTxt]} 100 160 450 180 \
  834.     -c {Cmd-double-clicking on non-text file link opens file} $HTMLmodeVars(openNonTextFile) 10 190 450 205 \
  835.     -c {Return on non-text file in home page window opens file} $HTMLmodeVars(homeOpenNonTextFile) 10 210 450 225 \
  836.     -c {'Insert include tags' only inserts tags} $HTMLmodeVars(includeOnlyTags) 10 230 450 245 \
  837.     -n {Page 3 of preferences} \
  838.     -t {'Last modified' text} 10 65 150 80 -e [list $HTMLmodeVars(lastModified)] 160 65 450 80 \
  839.     -t {HTML menu icon:} 10 90 170 105 \
  840.     -m [list [concat [list [lindex $htmlIconTxt [lsearch $htmlIcons $HTMLmodeVars(htmlMenuIcon)]]] $htmlIconTxt]] 180 90 450 110 \
  841.     -t {HTML Utilities menu icon:} 10 115 170 130 \
  842.     -m [list [concat [list [lindex $htmlIconTxt [lsearch $htmlIcons $HTMLmodeVars(htmlUtilsMenuIcon)]]] $htmlIconTxt]] 180 115 450 135"
  843.  
  844.     return $box
  845. }
  846.  
  847. proc htmlGeneralFlags {} {
  848.     return [list browseInForeground saveWithoutAsking useLowerCase useTabMarks pIsContainer lidtAreContainers \
  849.     useBigWindows changeInBigWindows promptNoisily flashStatusBar simpleColoring \
  850.     tagColor attributeColor stringColor manualStartPage openNonTextFile homeOpenNonTextFile \
  851.     includeOnlyTags lastModified htmlMenuIcon htmlUtilsMenuIcon]
  852. }
  853.  
  854. proc htmlIndentationPrefsBox {} {
  855.     global HTMLmodeVars htmlIndentElements
  856.     set box "-t {HTML mode Indentation Preferences} 100 10 450 30 \
  857.     -t {Indent the content of} 10 40 450 55"
  858.     set ww 70; set hh 10
  859.     foreach ind $htmlIndentElements {
  860.         append box " -c $ind $HTMLmodeVars(indent${ind}) $hh $ww [expr $hh + 100] [expr $ww + 15]"
  861.         incr ww 20
  862.         if {$ww > 200} {
  863.             set ww 70
  864.             incr hh 110
  865.         }
  866.     }
  867.     return $box
  868. }
  869.  
  870. proc htmlIndentationFlags {} {
  871.     global htmlIndentElements
  872.     return "indent[join $htmlIndentElements " indent"]"
  873. }    
  874.  
  875. if {![alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  876. proc htmlJavaScriptPrefsBox {} {
  877.     global HTMLmodeVars alpha::colors
  878.     set box "-t {HTML mode JavaScript and CSS Preferences} 100 10 450 30 \
  879.     -c {Electric left braces} $HTMLmodeVars(elecLBrace) 10 35 450 50 \
  880.     -c {Electric right braces} $HTMLmodeVars(elecRBrace) 10 55 450 70 \
  881.     -c {Electric semicolon} $HTMLmodeVars(electricSemi) 10 75 450 90 \
  882.     -c {Color JavaScript keywords} $HTMLmodeVars(JavaScriptColoring) 10 95 450 110\
  883.     -t {Color of JavaScript keywords:} 10 115 215 130 \
  884.     -m [list [concat $HTMLmodeVars(JavaScriptColor) ${alpha::colors}]] 220 115 360 135 \
  885.     -c {Color CSS keywords} $HTMLmodeVars(CSSColoring) 10 165 450 180\
  886.     -t {Color of CSS keywords:} 10 185 215 200 \
  887.     -m [list [concat $HTMLmodeVars(CSSColor) ${alpha::colors}]] 220 185 360 205 \
  888.     -t {Color of JavaScript and CSS comments:} 10 210 270 225 \
  889.     -m [list [concat $HTMLmodeVars(JavaCommentColor) ${alpha::colors}]] 275 210 420 230"
  890.     
  891.     return $box
  892. }
  893.  
  894. proc htmlJavaScriptFlags {} {
  895.     return [list  elecLBrace elecRBrace electricSemi\
  896.     JavaScriptColoring JavaScriptColor CSSColoring CSSColor JavaCommentColor]
  897. }
  898. } else {
  899. proc htmlJavaScriptPrefsBox {} {
  900.     global HTMLmodeVars alpha::colors
  901.     set box "-t {HTML mode JavaScript and CSS Preferences} 100 10 450 30 \
  902.     -c {Color JavaScript keywords} $HTMLmodeVars(JavaScriptColoring) 10 35 450 50\
  903.     -t {Color of JavaScript keywords:} 10 55 215 70 \
  904.     -m [list [concat $HTMLmodeVars(JavaScriptColor) ${alpha::colors}]] 220 55 360 75 \
  905.     -c {Color CSS keywords} $HTMLmodeVars(CSSColoring) 10 105 450 120\
  906.     -t {Color of CSS keywords:} 10 125 215 140 \
  907.     -m [list [concat $HTMLmodeVars(CSSColor) ${alpha::colors}]] 220 125 360 145 \
  908.     -t {Color of JavaScript and CSS comments:} 10 150 270 165 \
  909.     -m [list [concat $HTMLmodeVars(JavaCommentColor) ${alpha::colors}]] 275 150 420 270"
  910.     
  911.     return $box
  912. }
  913.  
  914. proc htmlJavaScriptFlags {} {
  915.     return [list JavaScriptColoring JavaScriptColor CSSColoring CSSColor JavaCommentColor]
  916. }
  917. }
  918.  
  919. proc htmlCheckingPrefsBox {} {
  920.     global HTMLmodeVars
  921.     set box "-t {HTML mode Checking Links Preferences} 100 10 450 30 \
  922.     -t {These settings apply when you check links with Alpha:} 10 40 450 55 \
  923.     -c {Check anchors} $HTMLmodeVars(checkAnchors) 10 60 450 75 \
  924.     -c {Case sensitive checking (slower)} $HTMLmodeVars(caseSensitive) 10 80 450 95 \
  925.     -t {These settings apply when you check links with Big Brother:} 10 105 450 120\
  926.     -c {Bring Big Brother to front when checking links} $HTMLmodeVars(checkInFront) 10 125 450 140\
  927.     -c {Use Big Brother's link check options} $HTMLmodeVars(useBBoptions) 10 145 450 160\
  928.     -c {Ignore remote links (if you don't use Big Brother's option)} $HTMLmodeVars(ignoreRemote) 30 165 450 180\
  929.     -c {Ignore local links (if you don't use Big Brother's option)} $HTMLmodeVars(ignoreLocal) 30 185 450 200"
  930.     return $box
  931. }
  932.  
  933. proc htmlCheckingFlags {} {
  934.     return [list checkAnchors caseSensitive checkInFront useBBoptions ignoreRemote ignoreLocal]
  935. }
  936.  
  937. proc htmlWordPrefsBox {} {
  938.     global HTMLmodeVars
  939.     set box "-t {HTML mode Word Wrapping Preferences} 100 10 450 30 \
  940.     -t {Line width:} 10 40 90 55 -e [list $HTMLmodeVars(fillColumn)] 100 40 140 55 \
  941.     -t characters 145 40 300 55 \
  942.     -t {The variables below determine which characters build up words, and the word wrapping. Normally\
  943.     there is no need to change them. Read about them in general manual if you want to change them.} \
  944.     10 70 450 130 \
  945.     -t wordBreak: 10 140 150 155 -e [list $HTMLmodeVars(wordBreak)] 155 140 450 155 \
  946.     -t wordBreakPreface: 10 165 150 180 -e [list $HTMLmodeVars(wordBreakPreface)] 155 165 450 180 \
  947.     -t wrapBreak: 10 190 150 205 -e [list $HTMLmodeVars(wrapBreak)] 155 190 450 205 \
  948.     -t wrapBreakPreface: 10 215 150 230 -e [list $HTMLmodeVars(wrapBreakPreface)] 155 215 450 230"
  949. }
  950.  
  951. proc htmlWordFlags {} {
  952.     return [list fillColumn wordBreak wordBreakPreface wrapBreak wrapBreakPreface]
  953. }
  954.  
  955. proc htmlGlobalAttrsPrefs {} {
  956.     global HTMLmodeVars modifiedModeVars
  957.     set attrs " ID= CLASS= STYLE= TITLE= LANG= DIR= onClick= onDblClick= \
  958.      onMouseDown= onMouseUp= onMouseOver= onMouseMove= onMouseOut= onKeyPress= onKeyDown= onKeyUp="
  959.     set alwaysask $HTMLmodeVars(alwaysaskforAttributes)
  960.     set dontask $HTMLmodeVars(dontaskforAttributes)
  961.     set hidden $HTMLmodeVars(neveraskforAttributes)
  962.     htmlUseAttrsDialog "HTML mode Attributes Preferences" $attrs "" alwaysask hidden dontask 1
  963.     set HTMLmodeVars(alwaysaskforAttributes) $alwaysask
  964.     set HTMLmodeVars(dontaskforAttributes) $dontask
  965.     set HTMLmodeVars(neveraskforAttributes) $hidden
  966.     lappend modifiedModeVars {alwaysaskforAttributes HTMLmodeVars} {dontaskforAttributes HTMLmodeVars} {neveraskforAttributes HTMLmodeVars}
  967. }
  968.  
  969. if {[file exists $PREFS:HTMLadditions.tcl]} {
  970.     if {[catch {htmlReadAdditions}]} {alertnote "An error occured while reading your custom elements."}
  971. }
  972. rename htmlReadAdditions ""
  973. rename htmlReadAdditions0 ""
  974.  
  975. htmlBuildMenu
  976. htmlBuildUtilsMenu
  977. htmlColorizing
  978. # Check that all home page folders exist.
  979. set tmp_notfind ""
  980. foreach tmp_hp $HTMLmodeVars(homePages) {
  981.     if {![file exists [lindex $tmp_hp 0]] || ![file isdirectory [lindex $tmp_hp 0]]} {
  982.         alertnote "Can't find the folder for the home page [lindex $tmp_hp 1][lindex $tmp_hp 2]"
  983.         set tmp_notfind "[lindex $tmp_hp 1][lindex $tmp_hp 2]"
  984.     }
  985. }
  986. if {$tmp_notfind != ""} {htmlHomePages $tmp_notfind}
  987. catch {unset tmp tmp_notfind tmp_hp}
  988.  
  989. # Define a couple of key bindings.
  990. if {[file exists "$PREFS:HTML:HTML entity keys"]} {
  991.     source "$PREFS:HTML:HTML entity keys"
  992. } else {        
  993.     if {![info exists htmlEntityKeys([list less than])]} {
  994.         set htmlEntityKeys([list less than]) "<U<B<I/,"
  995.         set htmlEntityKeysProc([list less than]) {htmlInsertCharacter "less than"}
  996.     }
  997.     if {![info exists htmlEntityKeys([list greater than])]} {
  998.         set htmlEntityKeys([list greater than]) "<U<B<I/."
  999.         set htmlEntityKeysProc([list greater than]) {htmlInsertCharacter "greater than"}
  1000.     }
  1001.     if {![info exists htmlEntityKeys(ampersand)]} {
  1002.         set htmlEntityKeys(ampersand) "<U<B<I/7"
  1003.         set htmlEntityKeysProc(ampersand) {htmlInsertCharacter ampersand}
  1004.     }
  1005.     if {![info exists htmlEntityKeys([list nonbreak space])]} {
  1006.         set htmlEntityKeys([list nonbreak space]) "<U<B<I/ "
  1007.         set htmlEntityKeysProc([list nonbreak space]) {htmlInsertCharacter "nonbreak space"}
  1008.     }
  1009.     htmlSaveCache "HTML entity keys" "array set htmlEntityKeys [list [array get htmlEntityKeys]]\rarray set htmlEntityKeysProc [list [array get htmlEntityKeysProc]]"
  1010. }
  1011.  
  1012. bind::fromArray htmlEntityKeys htmlEntityKeysProc 0 HTML
  1013. catch {unset htmlEntityKeys htmlEntityKeysProc}
  1014.  
  1015. proc htmlBindBraces {args} {
  1016.     global bind::LeftBrace bind::RightBrace
  1017.     eval bind [keys::toBind ${bind::LeftBrace}] htmlLeftBrace HTML
  1018.     eval bind [keys::toBind ${bind::RightBrace}] htmlRightBrace HTML
  1019. }
  1020. htmlBindBraces
  1021. trace variable bind::LeftBrace w htmlBindBraces
  1022. trace variable bind::RightBrace w htmlBindBraces
  1023.  
  1024. # Comment line
  1025. bind 'l' <C>  htmlCommentLine HTML
  1026.  
  1027.  
  1028. # Register hooks
  1029. hook::register saveHook htmlUpdateLastMod HTML
  1030. hook::register saveasHook htmlUpdateLastMod HTML
  1031. hook::register quitHook htmlQuitHook
  1032. hook::register closeHook htmlCloseHook Home
  1033. hook::register deactivateHook htmldeactivateHook Home
  1034. hook::register activateHook htmlActivateHook HTML
  1035. hook::register openHook htmlActivateHook HTML
  1036.  
  1037. proc HTML::OptionTitlebar {} {
  1038.     global htmlPopUptag
  1039.     return [set htmlPopUptag [htmlGetAttributes]]
  1040. }
  1041.  
  1042. proc HTML::OptionTitlebarSelect {item} {
  1043.     global htmlPopUptag
  1044.     if {[lsearch -exact $htmlPopUptag $item] >= 0} {
  1045.         htmlInsertAttributes $item
  1046.     } else {
  1047.         error "Not an attibute."
  1048.     }
  1049. }
  1050.  
  1051. if {![alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  1052. proc htmlLeftBrace {} {
  1053.     global elecLBrace
  1054.     set old $elecLBrace
  1055.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1056.         set elecLBrace 0
  1057.     }
  1058.     catch {bind::LeftBrace}
  1059.     set elecLBrace $old
  1060. }
  1061. proc htmlRightBrace {} {
  1062.     global elecRBrace
  1063.     set old $elecRBrace
  1064.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1065.         set elecRBrace 0
  1066.     }
  1067.     catch {bind::RightBrace}
  1068.     set elecRBrace $old
  1069. }
  1070. } else {
  1071. proc htmlLeftBrace {} {
  1072.     global electricBraces
  1073.     set old $electricBraces
  1074.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1075.         set electricBraces 0
  1076.     }
  1077.     catch {bind::LeftBrace}
  1078.     set electricBraces $old
  1079. }
  1080. proc htmlRightBrace {} {
  1081.     global electricBraces
  1082.     set old $electricBraces
  1083.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1084.         set electricBraces 0
  1085.     }
  1086.     catch {bind::RightBrace}
  1087.     set electricBraces $old
  1088. }
  1089. }
  1090. if {[info exists cssModeIsLoaded] && $htmlVersion != $cssVersion} {
  1091.     alertnote "Warning: The versions of HTML mode and CSS mode may not be compatible.\
  1092.         Always install new versions of HTML mode and CSS mode simultaneously."
  1093. }
  1094.  
  1095. set htmlModeIsLoaded 1
  1096.  
  1097. message "HTML initialization complete."
  1098.